package com.itbaizhan;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

/*DES对称算法*/
public class DESdemo {

    public static void main(String[] args) throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
        //原文
        //String input = "itbaizhan";
        //密文
        String input = "Xe+peC+BpKTm2gVBIAQ6rQ==";
        //2 密钥  必须是8位
        String key = "87654321";
        //3，算法
        String algorithm = "DES";

       // String s = encryptDES(input, key, algorithm);
        //System.out.println(s); //Xe+peC+BpKTm2gVBIAQ6rQ==

        String decrypt = decrypt(input, key, algorithm);
        System.out.println(decrypt);

    }

    /**
     * 加密方法
     * @param input  原文
     * @param key   密钥
     * @param algorithm   算法
     * @return
     */

    // 静态的  有返回值
    private static  String encryptDES(String input,String key,String algorithm) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException {
        //1,获取对称加密对象
        Cipher cipher = Cipher.getInstance(algorithm);
        //2,创建加密规则
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);

        //3,初始化加密模式 ENCRYPT_MODE 加密    DECRYPT_MODE 解密
        cipher.init(Cipher.ENCRYPT_MODE,secretKeySpec);
        //4,加密  先加密，再用base64
        byte[] bytes = cipher.doFinal(input.getBytes());
        bytes = Base64.getEncoder().encode(bytes);
        return new String(bytes);

    }

    //解密

    /**
     *
     * @param input  密文 不是原文
     * @param key    密钥
     * @param algorithm   算法
     * @return
     */
    private static String decrypt(String input,String key,String algorithm) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {

        //1,获取对称加密对象
        Cipher cipher = Cipher.getInstance(algorithm);
        //2,创建加密规则
        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),algorithm);
        //3,初始化加密模式 ENCRYPT_MODE 加密    DECRYPT_MODE 解密
        cipher.init(Cipher.DECRYPT_MODE,secretKeySpec);
        //解密   getDecoder()     行用base64,再解密
        byte[] decode = Base64.getDecoder().decode(input);
        byte[] bytes = cipher.doFinal(decode);  //byte数组
        return new String(bytes);   //byte数组转为字符串


    }
}
/*对称加密
对称加密指的就是加密和解密使用同一个秘钥，所以叫做对称加密。对称加密只有一个秘钥，作为私钥。

对称加密算法
DES
AES
3DES
特点
加密速度快, 可以加密大文件
密文可逆, 一旦密钥文件泄漏, 就会导致数据暴露
加密后编码表找不到对应字符, 出现乱码
一般结合Base64使用*/